Micron Document
🎖️GitЯра🎖️

Node / meshcore / MeshCore / files / src / Dispatcher.h

Displaying Raw • Download

src/Dispatcher.h 9f73fbf87002682ba3c1f3da32b7252d8ea2feda (9f73fbf8) Text, 6.40 KB

Tff7b72#Tff7b72pragma once

Tff7b72#Tff7b72include T8b949e<MeshCore.h>
Tff7b72#Tff7b72include T8b949e<Identity.h>
Tff7b72#Tff7b72include T8b949e<Packet.h>
Tff7b72#Tff7b72include T8b949e<Utils.h>
Tff7b72#Tff7b72include T8b949e<string.h>

Te6edf3namespace Te6edf3mesh Tb4b4b4{

T8b949e/**
* \brief Abstraction of local/volatile clock with Millisecond granularity.
*/
Te6edf3class Te6edf3MillisecondClock Tb4b4b4{
Te6edf3publicTff7b72:
Te6edf3virtual Tffa657unsigned Tffa657long Te6edf3getMillisTb4b4b4(Tb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}Tb4b4b4;

T8b949e/**
* \brief Abstraction of this device's packet radio.
*/
Te6edf3class Te6edf3Radio Tb4b4b4{
Te6edf3publicTff7b72:
Te6edf3virtual Tffa657void Te6edf3beginTb4b4b4(Tb4b4b4) Tb4b4b4{ Tb4b4b4}

T8b949e/**
* \brief polls for incoming raw packet.
* \param bytes destination to store incoming raw packet.
* \param sz maximum packet size allowed.
* \returns 0 if no incoming data, otherwise length of complete packet received.
*/
Te6edf3virtual Tffa657int Te6edf3recvRawTb4b4b4(Tffa657uint8_tTff7b72* Te6edf3bytesTb4b4b4, Tffa657int Te6edf3szTb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;

T8b949e/**
* \returns estimated transmit air-time needed for packet of 'len_bytes', in milliseconds.
*/
Te6edf3virtual Tffa657uint32_t Te6edf3getEstAirtimeForTb4b4b4(Tffa657int Te6edf3len_bytesTb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;

Te6edf3virtual Tffa657float Te6edf3packetScoreTb4b4b4(Tffa657float Te6edf3snrTb4b4b4, Tffa657int Te6edf3packet_lenTb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;

T8b949e/**
* \brief starts the raw packet send. (no wait)
* \param bytes the raw packet data
* \param len the length in bytes
* \returns true if successfully started
*/
Te6edf3virtual Tffa657bool Te6edf3startSendRawTb4b4b4(Tff7b72const Tffa657uint8_tTff7b72* Te6edf3bytesTb4b4b4, Tffa657int Te6edf3lenTb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;

T8b949e/**
* \returns true if the previous 'startSendRaw()' completed successfully.
*/
Te6edf3virtual Tffa657bool Te6edf3isSendCompleteTb4b4b4(Tb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;

T8b949e/**
* \brief a hook for doing any necessary clean up after transmit.
*/
Te6edf3virtual Tffa657void Te6edf3onSendFinishedTb4b4b4(Tb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;

T8b949e/**
* \brief do any processing needed on each loop cycle
*/
Te6edf3virtual Tffa657void Te6edf3loopTb4b4b4(Tb4b4b4) Tb4b4b4{ Tb4b4b4}

Te6edf3virtual Tffa657int Te6edf3getNoiseFloorTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return T79c0ff0Tb4b4b4; Tb4b4b4}

Te6edf3virtual Tffa657void Te6edf3triggerNoiseFloorCalibrateTb4b4b4(Tffa657int Te6edf3thresholdTb4b4b4) Tb4b4b4{ Tb4b4b4}

Te6edf3virtual Tffa657void Te6edf3setCADEnabledTb4b4b4(Tffa657bool Te6edf3enableTb4b4b4) Tb4b4b4{ Tb4b4b4}

Te6edf3virtual Tffa657void Te6edf3resetAGCTb4b4b4(Tb4b4b4) Tb4b4b4{ Tb4b4b4}

Te6edf3virtual Tffa657bool Te6edf3isInRecvModeTb4b4b4(Tb4b4b4) Tff7b72const Tff7b72= T79c0ff0Tb4b4b4;

T8b949e/**
* \returns true if the radio is currently mid-receive of a packet.
*/
Te6edf3virtual Tffa657bool Te6edf3isReceivingTb4b4b4(Tb4b4b4) Tb4b4b4{ Tff7b72return Tffa657falseTb4b4b4; Tb4b4b4}

Te6edf3virtual Tffa657float Te6edf3getLastRSSITb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return T79c0ff0Tb4b4b4; Tb4b4b4}
Te6edf3virtual Tffa657float Te6edf3getLastSNRTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return T79c0ff0Tb4b4b4; Tb4b4b4}
Tb4b4b4}Tb4b4b4;

T8b949e/**
* \brief An abstraction for managing instances of Packets (eg. in a static pool),
* and for managing the outbound packet queue.
*/
Te6edf3class Te6edf3PacketManager Tb4b4b4{
Te6edf3publicTff7b72:
Te6edf3virtual Te6edf3PacketTff7b72* Te6edf3allocNewTb4b4b4(Tb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3virtual Tffa657void Te6edf3freeTb4b4b4(Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;

Te6edf3virtual Tffa657void Te6edf3queueOutboundTb4b4b4(Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4, Tffa657uint8_t Te6edf3priorityTb4b4b4, Tffa657uint32_t Te6edf3scheduled_forTb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3virtual Te6edf3PacketTff7b72* Te6edf3getNextOutboundTb4b4b4(Tffa657uint32_t Te6edf3nowTb4b4b4) Tff7b72= T79c0ff0Tb4b4b4; T8b949e// by priority
Te6edf3virtual Tffa657int Te6edf3getOutboundCountTb4b4b4(Tffa657uint32_t Te6edf3nowTb4b4b4) Tff7b72const Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3virtual Tffa657int Te6edf3getOutboundTotalTb4b4b4(Tb4b4b4) Tff7b72const Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3virtual Tffa657int Te6edf3getFreeCountTb4b4b4(Tb4b4b4) Tff7b72const Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3virtual Te6edf3PacketTff7b72* Te6edf3getOutboundByIdxTb4b4b4(Tffa657int Te6edf3iTb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3virtual Te6edf3PacketTff7b72* Te6edf3removeOutboundByIdxTb4b4b4(Tffa657int Te6edf3iTb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3virtual Tffa657void Te6edf3queueInboundTb4b4b4(Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4, Tffa657uint32_t Te6edf3scheduled_forTb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3virtual Te6edf3PacketTff7b72* Te6edf3getNextInboundTb4b4b4(Tffa657uint32_t Te6edf3nowTb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}Tb4b4b4;

Tff7b72typedef Tffa657uint32_t Te6edf3DispatcherActionTb4b4b4;

Tff7b72#Tff7b72define ACTION_RELEASE (0)
Tff7b72#Tff7b72define ACTION_MANUAL_HOLD (1)
Tff7b72#Tff7b72define ACTION_RETRANSMIT(pri) (((uint32_t)1 + (pri))<<24)
Tff7b72#Tff7b72define ACTION_RETRANSMIT_DELAYED(pri, _delay) ((((uint32_t)1 + (pri))<<24) | (_delay))

Tff7b72#Tff7b72define ERR_EVENT_FULL (1 << 0)
Tff7b72#Tff7b72define ERR_EVENT_CAD_TIMEOUT (1 << 1)
Tff7b72#Tff7b72define ERR_EVENT_STARTRX_TIMEOUT (1 << 2)

T8b949e/**
* \brief The low-level task that manages detecting incoming Packets, and the queueing
* and scheduling of outbound Packets.
*/
Te6edf3class Te6edf3Dispatcher Tb4b4b4{
Te6edf3PacketTff7b72* Te6edf3outboundTb4b4b4; T8b949e// current outbound packet
Tffa657unsigned Tffa657long Te6edf3outbound_expiryTb4b4b4, Te6edf3outbound_startTb4b4b4, Te6edf3total_air_timeTb4b4b4, Te6edf3rx_air_timeTb4b4b4;
Tffa657unsigned Tffa657long Te6edf3next_tx_timeTb4b4b4;
Tffa657unsigned Tffa657long Te6edf3cad_busy_startTb4b4b4;
Tffa657unsigned Tffa657long Te6edf3radio_nonrx_startTb4b4b4;
Tffa657unsigned Tffa657long Te6edf3next_floor_calib_timeTb4b4b4, Te6edf3next_agc_reset_timeTb4b4b4;
Tffa657bool Te6edf3prev_isrecv_modeTb4b4b4;
Tffa657uint32_t Te6edf3n_sent_floodTb4b4b4, Te6edf3n_sent_directTb4b4b4;
Tffa657uint32_t Te6edf3n_recv_floodTb4b4b4, Te6edf3n_recv_directTb4b4b4;
Tffa657unsigned Tffa657long Te6edf3tx_budget_msTb4b4b4;
Tffa657unsigned Tffa657long Te6edf3last_budget_updateTb4b4b4;
Tffa657unsigned Tffa657long Te6edf3duty_cycle_window_msTb4b4b4;

Tffa657void Td2a8ffprocessRecvPacketTb4b4b4(Te6edf3PacketTff7b72* Te6edf3pktTb4b4b4)Tb4b4b4;
Tffa657void Td2a8ffupdateTxBudgetTb4b4b4(Tb4b4b4)Tb4b4b4;

Te6edf3protectedTff7b72:
Te6edf3PacketManagerTff7b72* Te6edf3_mgrTb4b4b4;
Te6edf3RadioTff7b72* Te6edf3_radioTb4b4b4;
Te6edf3MillisecondClockTff7b72* Te6edf3_msTb4b4b4;
Tffa657uint16_t Te6edf3_err_flagsTb4b4b4;

Te6edf3DispatcherTb4b4b4(Te6edf3RadioTff7b72& Te6edf3radioTb4b4b4, Te6edf3MillisecondClockTff7b72& Te6edf3msTb4b4b4, Te6edf3PacketManagerTff7b72& Te6edf3mgrTb4b4b4)
Tff7b72: Te6edf3_radioTb4b4b4(Tff7b72&Te6edf3radioTb4b4b4)Tb4b4b4, Te6edf3_msTb4b4b4(Tff7b72&Te6edf3msTb4b4b4)Tb4b4b4, Te6edf3_mgrTb4b4b4(Tff7b72&Te6edf3mgrTb4b4b4)
Tb4b4b4{
Te6edf3outbound Tff7b72= Tffa657NULLTb4b4b4;
Te6edf3total_air_time Tff7b72= Te6edf3rx_air_time Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3next_tx_time Tff7b72= Te6edf3msTb4b4b4.Te6edf3getMillisTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3cad_busy_start Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3next_floor_calib_time Tff7b72= Te6edf3next_agc_reset_time Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3_err_flags Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3radio_nonrx_start Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3prev_isrecv_mode Tff7b72= Tffa657trueTb4b4b4;
Te6edf3tx_budget_ms Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3last_budget_update Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3duty_cycle_window_ms Tff7b72= T79c0ff3600000Tb4b4b4;
Tb4b4b4}

Te6edf3virtual Te6edf3DispatcherAction Te6edf3onRecvPacketTb4b4b4(Te6edf3PacketTff7b72* Te6edf3pktTb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;

Te6edf3virtual Tffa657void Te6edf3logRxRawTb4b4b4(Tffa657float Te6edf3snrTb4b4b4, Tffa657float Te6edf3rssiTb4b4b4, Tff7b72const Tffa657uint8_t Te6edf3rawTb4b4b4[Tb4b4b4]Tb4b4b4, Tffa657int Te6edf3lenTb4b4b4) Tb4b4b4{ Tb4b4b4} T8b949e// custom hook

Te6edf3virtual Tffa657void Te6edf3logRxTb4b4b4(Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4, Tffa657int Te6edf3lenTb4b4b4, Tffa657float Te6edf3scoreTb4b4b4) Tb4b4b4{ Tb4b4b4} T8b949e// hooks for custom logging
Te6edf3virtual Tffa657void Te6edf3logTxTb4b4b4(Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4, Tffa657int Te6edf3lenTb4b4b4) Tb4b4b4{ Tb4b4b4}
Te6edf3virtual Tffa657void Te6edf3logTxFailTb4b4b4(Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4, Tffa657int Te6edf3lenTb4b4b4) Tb4b4b4{ Tb4b4b4}
Te6edf3virtual Tff7b72const Tffa657charTff7b72* Te6edf3getLogDateTimeTb4b4b4(Tb4b4b4) Tb4b4b4{ Tff7b72return Ta5d6ff"Ta5d6ff"Tb4b4b4; Tb4b4b4}

Te6edf3virtual Tffa657float Te6edf3getAirtimeBudgetFactorTb4b4b4(Tb4b4b4) Tff7b72constTb4b4b4;
Te6edf3virtual Tffa657int Te6edf3calcRxDelayTb4b4b4(Tffa657float Te6edf3scoreTb4b4b4, Tffa657uint32_t Te6edf3air_timeTb4b4b4) Tff7b72constTb4b4b4;
Te6edf3virtual Tffa657uint32_t Te6edf3getCADFailRetryDelayTb4b4b4(Tb4b4b4) Tff7b72constTb4b4b4;
Te6edf3virtual Tffa657uint32_t Te6edf3getCADFailMaxDurationTb4b4b4(Tb4b4b4) Tff7b72constTb4b4b4;
Te6edf3virtual Tffa657int Te6edf3getInterferenceThresholdTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return T79c0ff0Tb4b4b4; Tb4b4b4} T8b949e// disabled by default
Te6edf3virtual Tffa657bool Te6edf3getCADEnabledTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return Tffa657falseTb4b4b4; Tb4b4b4} T8b949e// hardware CAD disabled by default
Te6edf3virtual Tffa657int Te6edf3getAGCResetIntervalTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return T79c0ff0Tb4b4b4; Tb4b4b4} T8b949e// disabled by default
Te6edf3virtual Tffa657unsigned Tffa657long Te6edf3getDutyCycleWindowMsTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return T79c0ff3600000Tb4b4b4; Tb4b4b4}

Te6edf3publicTff7b72:
Tffa657void Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657void Td2a8ffloopTb4b4b4(Tb4b4b4)Tb4b4b4;

Te6edf3PacketTff7b72* Td2a8ffobtainNewPacketTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657void Td2a8ffreleasePacketTb4b4b4(Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4)Tb4b4b4;
Tffa657void Td2a8ffsendPacketTb4b4b4(Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4, Tffa657uint8_t Te6edf3priorityTb4b4b4, Tffa657uint32_t Te6edf3delay_millisTff7b72=T79c0ff0Tb4b4b4)Tb4b4b4;

Tffa657unsigned Tffa657long Td2a8ffgetTotalAirTimeTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return Te6edf3total_air_timeTb4b4b4; Tb4b4b4}
Tffa657unsigned Tffa657long Td2a8ffgetReceiveAirTimeTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{Tff7b72return Te6edf3rx_air_timeTb4b4b4; Tb4b4b4}
Tffa657unsigned Tffa657long Td2a8ffgetRemainingTxBudgetTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return Te6edf3tx_budget_msTb4b4b4; Tb4b4b4}
Tffa657uint32_t Td2a8ffgetNumSentFloodTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return Te6edf3n_sent_floodTb4b4b4; Tb4b4b4}
Tffa657uint32_t Td2a8ffgetNumSentDirectTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return Te6edf3n_sent_directTb4b4b4; Tb4b4b4}
Tffa657uint32_t Td2a8ffgetNumRecvFloodTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return Te6edf3n_recv_floodTb4b4b4; Tb4b4b4}
Tffa657uint32_t Td2a8ffgetNumRecvDirectTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return Te6edf3n_recv_directTb4b4b4; Tb4b4b4}
Tffa657void Td2a8ffresetStatsTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3n_sent_flood Tff7b72= Te6edf3n_sent_direct Tff7b72= Te6edf3n_recv_flood Tff7b72= Te6edf3n_recv_direct Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3_err_flags Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}

T8b949e// helper methods
Tffa657bool Td2a8ffmillisHasNowPassedTb4b4b4(Tffa657unsigned Tffa657long Te6edf3timestampTb4b4b4) Tff7b72constTb4b4b4;
Tffa657unsigned Tffa657long Td2a8fffutureMillisTb4b4b4(Tffa657int Te6edf3millis_from_nowTb4b4b4) Tff7b72constTb4b4b4;

Tffa657bool Td2a8fftryParsePacketTb4b4b4(Te6edf3PacketTff7b72* Te6edf3pktTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3rawTb4b4b4, Tffa657int Te6edf3lenTb4b4b4)Tb4b4b4;

Te6edf3privateTff7b72:
Tffa657void Te6edf3checkRecvTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657void Td2a8ffcheckSendTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4;

Tb4b4b4}

Served by rngit 1.5.3 - Generated in 0.13s